#
#マイルストーンの追加，編集，削除などを行うコントローラ．
#主にAjax経由で呼ばれる．
#
class MilestoneController < ApplicationController
  # 共通レイアウト定義
  layout "mainpage", :except=>[:dlg_index, :dlg_new, :dlg_edit, :dlg_create, :dlg_update, :dlg_destroy]

  # フィルタ定義
  before_filter :login_required # ログインチェック

  # 追加ヘルパー定義
  helper :project

  # コントローラー使用のヘルパー定義
  include ApplicationHelper

  #
  # メソッド：dlg_indexアクション
  # 概　　要：マイルストーン編集ダイアログのためのデフォルトアクション
  ###########################################################
  def dlg_index
  end

  #
  #=== マイルストーン新規作成(追加用の空データ生成)
  #
  #空のマイルストーンデータを生成し，必要なデータをセットしてjson形式で返却
  #* task_kbn: 2をセット(マイルストーンのtask_kbnが2であるため)
  #
  def dlg_new
    #-----------------------------
    # 新規マイルストーンオブジェクト生成
    #-----------------------------
    @miles = DatMilestone.new
    #-----------------------------
    # 新規プロジェクト構成データオブジェクト生成
    # ※分類パラメータを初期設定（:dlg_tsk_edit_comp）
    #-----------------------------
    @projectcomp = DatProjectcomp.new(params[:dlg_mil_edit_comp])
    @projectcomp.task_kbn = "2" ;
    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :miles       => @miles.attributes,
      :projectcomp => @projectcomp.attributes
    }
    render :text => result_for_json( true, '', result )
  end

  #
  #=== マイルストーン編集(編集用のjsonデータを生成)
  #
  #params[:dlg_mil_edit_comp][:id]で指定されたマイルストーンを取得し，
  #json形式のデータにして返却する
  #
  #params[:dlg_mil_edit_comp][:id] :: プロジェクトアイテムID(関連するマイルストーンデータを同時に取得)
  #
  def dlg_edit
    if params[:dlg_mil_edit_comp][:id].nil? || params[:dlg_mil_edit_comp][:id] == ""
      #-----------------------------
      # IDが指定されていない場合、新規作成処理へリダイレクト
      #-----------------------------
      redirect_to :action => 'dlg_new'
      return
    end
    #-----------------------------
    # 登録済みプロジェクト構成情報を取得
    # ※プロジェクト、マイルストーン情報も同時に取得
    #-----------------------------
    @projectcomp = DatProjectcomp.find_milestone(params[:dlg_mil_edit_comp][:id])

    @miles = @projectcomp.dat_milestone
    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :miles       => @miles.attributes,
      :projectcomp => @projectcomp.attributes
    }
    render :text => result_for_json(true, '', result)
  end

  #
  #=== マイルストーン新規作成
  #
  #フォームから渡ってきたデータを元にまずプロジェクトアイテムを作成する
  #同時にマイルストーンを新規に作成して結果をjsonデータで返却する
  #
  #params[:dlg_mil_edit_comp] :: プロジェクトアイテムデータ
  #params[:dlg_mil_edit_miles] :: マイルストーンデータ
  #
  def dlg_create
    session_user_id = session["user"]["id"] 

    #-----------------------------
    # 新規プロジェクト構成データ生成
    #-----------------------------
    # フォームパラメータから新規プロジェクト構成オブジェクトを生成
    @projectcomp = DatProjectcomp.new(params[:dlg_mil_edit_comp])
    @projectcomp.task_kbn = "2" ;
    @projectcomp.create_user_id = session_user_id
    @projectcomp.update_user_id = session_user_id
    @projectcomp.last_operation_kbn = 2

    #-----------------------------
    # 新規マイルストーンデータ生成
    #-----------------------------
    # フォームパラメータから新規マイルストーンオブジェクトを生成
    @miles = DatMilestone.new( params[:dlg_mil_edit_miles] )
    @miles.create_user_id = session_user_id
    @miles.update_user_id = session_user_id
    @miles.last_operation_kbn = 2
    @projectcomp.dat_milestone = @miles

    #-----------------------------
    # 追加位置（行番号）決定
    #-----------------------------
    # 基準となるプロジェクト構成IDが指定されている場合
    if ! params[:dlg_mil_edit_base_id].nil? && ! params[:dlg_mil_edit_base_id].empty?
      # 基準となるプロジェクト構成IDが指定されている場合
      # 基準データの後ろに追加
      base_projectcomp = DatProjectcomp.find(params[:dlg_mil_edit_base_id])

      @projectcomp.line_no = base_projectcomp.line_no + 1
    else
      # 基準となるプロジェクト構成IDが指定されていない場合
      # プロジェクトの最後尾に追加
      max_line_no = DatProjectcomp.maximum( :line_no,
                                            :conditions=>["project_id = ? ", @projectcomp.project_id]
                                          )
      max_line_no = 0 if max_line_no.nil?
      @projectcomp.line_no = max_line_no + 1
    end

    #-----------------------------
    # プロジェクト構成データ保存実施
    #-----------------------------
    unless @projectcomp.save
      # ????? エラー処理 ????? 
      message = error_message_to_string(@projectcomp, 
                                        {:item_name=>app_localized_message(:label, :mils_name)})
      if ! @miles.errors.empty?
        message += "\n" unless message == ""
        message += error_message_to_string(@miles)
      end
      render :text => result_for_json( false, message, {} )
      return
    end

    #-----------------------------
    # 行番号更新
    #-----------------------------
    if ! params[:dlg_mil_edit_base_id].nil? && ! params[:dlg_mil_edit_base_id].empty?
      # 間に挿入した場合、以降の構成データの行番号をずらす
      if ! DatProjectcomp.update_all(" line_no = line_no + 1 ", 
                                   [ "project_id = ? AND line_no >= ? AND id <> ? ",
                                       @projectcomp.project_id,
                                       @projectcomp.line_no,
                                       @projectcomp.id ]
                                     )

        # ????? エラー処理 ????? 
        render :text => result_for_json(false, app_localized_message(:error, :milestone_lineno_save_error), {})
        return
      end
    end

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :resulthtml => ""
    }
    render :text => result_for_json(true, '', result)
  end


  #
  #マイルストーンデータの更新
  #
  #指定されたプロジェクトアイテムと関連するマイルストーンデータを取得する．
  #取得されたデータをフォームから渡ってきたデータで更新する．
  #
  #params[:dlg_mil_edit_comp] :: プロジェクトアイテムデータ
  #params[:dlg_mil_edit_miles] :: マイルストーンデータ
  #
  def dlg_update
    session_user_id = session["user"]["id"]

    #-----------------------------
    # 登録済みオブジェクトを取得
    #-----------------------------
    @projectcomp = DatProjectcomp.find_milestone(params[:dlg_mil_edit_comp][:id])
    @projectcomp.update_user_id     = session_user_id
    @projectcomp.last_operation_kbn = 3
    
    @miles = @projectcomp.dat_milestone
    @miles.update_user_id     = session_user_id
    @miles.last_operation_kbn = 3

    #-----------------------------
    # プロジェクト構成データ保存実施
    #-----------------------------
    unless @projectcomp.update_attributes(params[:dlg_mil_edit_comp])
      # ????? エラー処理 ????? 
      message = error_message_to_string(@projectcomp, 
                                        {:item_name=>app_localized_message(:label, :mils_name)})
      render :text => result_for_json( false, message, {} )
      return
    end
    #-----------------------------
    # マイルストーンデータ保存実施
    #-----------------------------
    unless @miles.update_attributes(params[:dlg_mil_edit_miles])
      # ????? エラー処理 ????? 
      message = error_message_to_string(@miles)
      render :text => result_for_json( false, message, {} )
      return
    end

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :resulthtml   => ""
    }
    render :text => result_for_json(true, '', result)
  end


  #
  #=== マイルストーンの削除
  #
  #params[:dlg_mil_edit_comp][:id]で指定されたプロジェクトアイテムを取得し削除を行う
  #関連するマイルストーンデータも同時に削除される
  #
  #params[:dlg_mil_edit_comp][:id] :: プロジェクトアイテムID
  #
  def dlg_destroy
    unless DatProjectcomp.destroy(params[:dlg_mil_edit_comp][:id])
      render :text => result_for_json(false, app_localized_message(:error, :milestone_destroy_error), {})
    else
      result  = {
        :resulthtml   => ""
      }
      render :text => result_for_json(true, '', result)
    end
  end

end